/**
 * 通用js类，需选引入jqury、layer、noty
 * 
 * @author zsp
 * @date 2017-12-15
 */

(function() {
	if (!window.FPX) {
		FPX = {};
	}
	if (!FPX.msg || !FPX.dialog) {
		FPX.msg = {};
		FPX.dialog = {};
	}
})();

FPX.msg.success = function(text, callback) {
	UED.Noty.success({
		text: text,
		callback: {
			afterClose: function() {
				if (typeof callback == "function") {
					callback();
				}
			}
		}
	});
};

FPX.msg.warn = function(text, callback) {
	UED.Noty.warning({
		text: text,
		callback: {
			afterClose: function() {
				if (typeof callback == "function") {
					callback();
				}
			}
		}
	});
};

FPX.msg.error = function(text) {
	UED.Noty.error(text);
};


FPX.dialog = function(options) {
	options = $.extend({}, {
		url: '',
		title: '信息',
		width: '768px',
		height: '450px',
		callback: function() {},
		success: function() {},
		yes: function() {}
	}, options || {});

	layer.open({
		title: options.title,
		type: 2,
		area: [options.width, options.height],
		fixed: false, //不固定
		moveOut: true,
		content: options.url,
		end: function() {
			if (typeof options.callback == "function") {
				options.callback();
			}
		},
		success: function() {
			if (typeof options.success == "function") {
				options.success();
			}
		},
		yes: function() {
			if (typeof options.success == "function") {
				options.yes();
			}
		},
	});
};

FPX.confirm = function(text, callback) {
	UED.Confirm.error({
		title: '温馨提示',
		text: text,
		buttons: [{
			id: '',
			addClass: 'btn btn-default',
			text: '取消',
			onClick: function($noty) {
				$noty.close();
			}
		}, {
			id: '',
			addClass: 'btn btn-danger',
			text: '确定',
			onClick: function($noty) {
				if (typeof callback == "function") {
					callback();
				}
			}
		}]
	});
};

FPX.dialog.close = function() {
	parent.layer.closeAll();
};



FPX.form = {
	serializeJson: function(frm) {
		var json = {};
		frm = frm || $('body');
		if (!frm) {
			return json;
		}
		var inputs = frm.find('input[type!=button][type!=reset][type!=submit][type!=image],select,textarea');
		if (!inputs) {
			return json;
		}
		//解决checkbox bug,by 737878
		inputs.each(function() {
			var type = this.type;
			var tagName = this.tagName;
			var name = this.name;
			var value = $.trim(this.value);
			if (name != null && $.trim(name) != '' && value != null && $.trim(value) != '') {
				if (type == 'checkbox') {
					if (this.checked) {
						if (json[name] == undefined)
							json[name] = value;
						else
							json[name] += ("," + value);
					}
				} else if (type == 'radio') {
					if (this.checked) {
						json[name] = value;
					}
				} else if (type == 'select-multiple') {
					json[name] = $(this).val().join(',');
				} else if (type == 'select-one') {
					json[name] = value;
				} else {
					json[name] = value;
				}
			}
		});
		return json;
	},
	/**
	 * 清空表单
	 * @param formId
	 */
	cleanForm: function(formId) {
		$(':input', '#' + formId)
			.not(':button, :submit, :reset')
			.val('')
			.removeAttr('checked')
			.removeAttr('selected');
		$('#' + formId).find('textarea').val('');
	}
};
(function($) {
	$.fn.serializeJson = function() {
		return FPX.form.serializeJson($(this));
	};
}(jQuery));


/**
 * FPX.ajax
 * 
 * 根据现有业务改写 ajax 方法：
 * 1、接收数据默认为 json，返回 html 时需要另外指定(便于后端确定返回 json 或者 html)
 * 2、禁用 ajax 的 success/error/complete 方法，提倡使用 derferred 的 done/fail/then
 */
FPX.ajax = function(url, options) {
	// 默认设置
	var defaultOption = {
		dataType: 'json', // 默认服务器返回的数据类型为 json，如果返回 html 则需要进行设置
		errorHandler: true, // 对返回 ResposeMessage 出现Error时，进行处理
		failHandler: true // 对请求异常时，进行处理
	};

	// url 可为空
	if (typeof url === 'object') {
		options = url;
		url = undefined;
	}

	options = options || {};

	// 限制使用 success/error/complete
	if ($.isFunction(options.success)) {
		throw new Error('Please use done of Deferred');
	}

	if ($.isFunction(options.error)) {
		throw new Error('Please use fail of Deferred');
	}

	if ($.isFunction(options.complete)) {
		throw new Error('Please use always of Deferred');
	}

	options.url = url || options.url;

	// 如果是 json 对象，则更改默认发送内容类型
	var param = options.data;
	//		var contentType = options.contentType;
	//		if(!contentType && (typeof param === 'object' || typeof param === 'array')) {
	//			defaultOption.contentType = 'FPXlication/json; charset=utf-8';
	//			options.data = JSON.stringify(param);
	//		}

	// 用户定义参数覆盖默认设置
	var opt = $.extend({}, defaultOption, options);

	// 进行方法的拦截处理
	var ajax = $.ajax(opt).done(function(data, textStatus, jqXHR) {
		try {
			//通过XMLHttpRequest取得响应头，sessionstatus，  
			var sessionstatus = jqXHR.getResponseHeader("sessionstatus");
			if (sessionstatus == "timeout") {
				var redirectURL = jqXHR.getResponseHeader("redirectURL");
				// 如果超时跳转指定的页面
				window.location = redirectURL;
			}
		} catch (e) {
			console.log(e);
		}
	}).fail(function(jqXHR, textStatus, errorThrown) {
		// 异常时，统一提供系统异常的提示，如果是中断请求则不用进行提示(比如 ajax 刷新页面)
		//对于返回的消息格式解析不了不弹框提示，主要针对401，session过期
		if ((jqXHR.readyState >= 2) && (opt.failHandler) && ('parsererror' !== textStatus) && (jqXHR.status !== 404)) {
			console.log('系统异常');
		}
	}).done(function(data, textStatus, jqXHR) {
		// 异常时，统一提供系统异常的提示
		if (opt.errorHandler && data.hasError) {
			console.log(data.failureString);
		}
	});

	return ajax;
};

FPX.storage = {
	init: function() {
		this.storage = window.localStorage;
	},
	put: function(key, value) {
		this.storage && this.storage.setItem && this.storage.setItem(key, value);
	},
	get: function(key) {
		if (this.storage && this.storage.getItem) {
			return this.storage.getItem(key);
		}
		return null;
	},
	clear: function() {
		this.storage && this.storage.clear();
	}
};

//	FPX.storage.init();

/**
 *  获取url路径参数
 */
FPX.getUrlParam = function(name) {
	var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); //构造一个含有目标参数的正则表达式对象
	var r = window.location.search.substr(1).match(reg); //匹配目标参数
	if (r !== null) return decodeURI(r[2]);
	return null; //返回参数值
};